package cn.tedu._05mvcboot02.controller;

import cn.tedu._05mvcboot02.mapper.UserMapper;
import cn.tedu._05mvcboot02.pojo.dto.UserInsertDTO;
import cn.tedu._05mvcboot02.pojo.entity.User;
import cn.tedu._05mvcboot02.pojo.vo.UserListVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

//@Controller
@RestController
@RequestMapping("/v1/users/")
@Slf4j
@Api(tags = "01.用户模块")
public class UserController {
    /**
     * API文档:
     * 1.请求地址：/v1/users/insert
     * 2.请求方法：POST
     * 3.请求体数据：用户名username、密码password、昵称nickname
     * 4.返回响应：添加成功
     */
    @Autowired
    private UserMapper userMapper;

    @PostMapping("insert")
    @ApiOperation("插入用户数据")
    //@ResponseBody
    //通过DTO类反射 获取数据
    //调用接口的实现类方法 在哪里用 就在哪里装配
    public String insert(UserInsertDTO userInsertDTO) {
        log.debug("userInsertDTO = " + userInsertDTO);
        /*
            梳理业务逻辑,确定接口(以注册功能为例)
            1.获取用户输入的数据
            2.校验用户输入的数据的合法性-借助框架校验
            3.校验用户名是否被占用[SELECT接口-MyBatis]
                3.1 被占用 提示用户名被占用
                3.2 未被占用 插入数据[INSERT接口],返回响应
         */
        User user = new User();
        //复制属性: BeanUtils.copyProperties(要进行复制属性值的类对象,目标类对象)
        BeanUtils.copyProperties(userInsertDTO, user);
        user.setCreated(new Date());
        //调用接口方法
        userMapper.insertUser(user);
        return "添加成功";
    }

    /**
     * API文档2:
     * 1.请求地址：/v1/users/userList
     * 2.请求方法：GET
     * 3.查询参数：无
     * 4.返回响应：List<UserListVO> 显示: 用户名username 和 密码password
     */
    @ApiOperation("获取用户列表")
    @GetMapping("userList")
    //@ResponseBody
    public List<UserListVO> userList() {
        return userMapper.selectUserList();
    }

    /**
     * API文档3:
     * 请求地址：/v1/users/delete
     * 请求方法：GET
     * 查询参数：用户id
     * 返回响应：String "删除成功"
     */
    @ApiOperation("删除用户")
    @GetMapping("delete")
    //@ResponseBody
    @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "int")
    public String delete(Integer id) {
        if (id < 0) {
            throw new IllegalArgumentException("ID不能小于0");
        }
        log.debug("id = " + id);
        userMapper.deleteUserById(id);
        return "删除成功";
    }

    /**
     * API文档4:
     * 请求地址：/v1/users/update
     * 请求方法：POST[动态修改]
     * 请求体数据：用户id、用户名username、密码password、昵称nickname、时间created
     * 返回响应：String "修改成功"
     */
    @ApiOperation("更新用户")
    @PostMapping("update")
    //@ResponseBody
    public String update(User user) {
        log.debug("user = " + user);
        userMapper.updateUser(user);
        return "修改成功";
    }

    /**
     * 5.获取指定用户信息功能: 在path中传递数据
     * http://localhost:8080/v1/users/select/用户ID
     */
    @ApiOperation("查询指定用户")
    @GetMapping("select/{uid}")
    @ApiImplicitParam(name = "uid", value = "用户ID", required = true, dataType = "int")
    public User select(@PathVariable Integer uid) {
        log.debug("uid = " + uid);
        return userMapper.selectUserById(uid);
    }
}
